package model;

import historyElemente.HistoryElement;
import historyElemente.HistoryHtmlString;
import historyElemente.HistoryString;
import historyElemente.HistoryWhitespace;
import historyElemente.Tag;

import java.awt.FontMetrics;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;

/**
 * Repr&auml;sentiert eine Zeile der ChatHistory
 * @author Simon
 *
 */
public class HistoryEintrag {
	
	private List<HistoryElement>  elemente;
	
	public HistoryEintrag(){
		elemente = new ArrayList<HistoryElement>();
	}
	public HistoryEintrag(String s){
		elemente = new ArrayList<HistoryElement>();
		
		char[] chars = s.toCharArray();
		for (int i = 0; i < chars.length; i++) {
			
			if(chars[i] == '<'){
				int end = s.indexOf('>', i);
				String tag = s.substring(i+1, end);
				int secondStart = s.indexOf('<', i+1);
				int secondEnd = s.indexOf('>', end+1);
//				System.out.println(i+" "+(end-1)+" "+secondStart+" "+secondEnd);
				String tagInhalt = s.substring(end+1, secondStart);
//				System.out.println("->"+tag + "<->"+tagInhalt+"<-");
				Tag[] tags = Tag.values();
				for (int j = 0; j < tags.length; j++) {
					if(tags[j].match(tag)){
						elemente.add(new HistoryHtmlString(tagInhalt, tags[j]));
						break;
					}
						
				}
				i = secondEnd;
				
				
//			} else if(chars[i] == ':'){
//				
			} else {
				int index = s.indexOf(' ', i);
				if(index < 0)
					index = s.length();
				String teil = s.substring(i, index);
//				System.out.println(teil);
				elemente.add(new HistoryString(teil));
				elemente.add(new HistoryWhitespace());
				i = index;
			}
	
		}
	}
	
	public void drawZeile(Graphics g, int x, int y){
		for (int i = 0; i < elemente.size(); i++) {
			elemente.get(i).drawElement(g, x , y);
//			System.out.print(elemente.get(i).toString());
			int breite = elemente.get(i).getWidth(g);
//			System.out.println(x + " " + breite);
			x += breite;
			
		}
//		System.out.println();
	}
	
	public int getWidth(Graphics g){
		int width = 0;
		for (int i = 0; i < elemente.size(); i++) {
			width += elemente.get(i).getWidth(g);
		}
		return width;
	}
	
	public void add(HistoryElement e){
		elemente.add(e);
	}
	
	public int size(){
		return elemente.size();
	}
	
	public void removeLast(int count){
		for (int i = 0; i < count; i++) {
			elemente.remove(elemente.size()-1);
//			System.out.println("removed: "+i+" new size:"+elemente.size());
		}
		
	}
	
	public int lastWhitespace(){
		int back = -1;
		for (int i = elemente.size()-1; i > 0; i--) {
//			System.out.println(i+": ->"+elemente.get(i)+"<-");
			if( elemente.get(i) instanceof HistoryWhitespace ){
				back = elemente.size() - i;
				break;
			}
		}
		return back;
	}
	
	/**
	 * Splittet einen zu langen String, sodass jeder Teilstring unter<br/>
	 * Beruecksichtigung der aktuellen Schriftart h&ouml;chstens so<br/>
	 * lang ist wie die angegebene Breite.
	 * 
	 */
	public HistoryEintrag[] split(int breite, Graphics g){
		// Brechnung der Anzahl an benoetigten Zeilen
		Double d = 1.5 + (getWidth(g) / (breite * 1.0d));
		int benoetigeZeilen = d.intValue();
		HistoryEintrag[] splitted = new HistoryEintrag[benoetigeZeilen];
		
		int index = 0;
		for (int z = 0; z < splitted.length; z++) {
			splitted[z] = new HistoryEintrag();
			int b = 0;
			// Checke nach jedem Zeichen die Breite der Zeile
			while (b < breite && index < size()) {
				splitted[z].add(elemente.get(index));
				b = splitted[z].getWidth(g);
				index++;
			}
//			System.out.println(b +" "+breite+" "+index);
			// Wenn nicht letzte Zeile dann gehe zurueck zum letzten Leerzeichen
			if (z + 1 < splitted.length) {
				int last = splitted[z].lastWhitespace();
//				System.out.println(last);
				if (last < 0){
					splitted[z].removeLast(1);
					index -= 1;
				} else {
					splitted[z].removeLast(last);
					index -= (last-1);
				}
			}


		}
		
		return splitted;
	}
	
}
